/******************************************************************************
 * @file    driver_soft_i2c.h
 * @author  canrad
 * @version v1.1
 * @date    2024-05-12
 * @brief   软件iic驱动
 ******************************************************************************/

#ifndef MTLIB_DRIVER_SOFT_I2C_H
#define MTLIB_DRIVER_SOFT_I2C_H

#include <mylib/mylib_config.h>

// 写控制bit
#define SOFT_I2C_WR 0
// 读控制bit
#define SOFT_I2C_RD 1

typedef struct
{
    uint32_t scl_gpio;
    uint32_t sda_gpio;
} soft_i2c_t;

void soft_i2c_init(soft_i2c_t* soft_i2c);

// 在访问I2C设备前，请先调用 soft_i2c_check_device()
// 检测I2C设备是否正常
uint8_t soft_i2c_check_device(soft_i2c_t* soft_i2c, uint8_t address);

// 发送一个字节
void soft_i2c_send_byte(soft_i2c_t* soft_i2c, uint8_t byte);

// 读取一个字节
uint8_t soft_i2c_read_byte(soft_i2c_t* soft_i2c, uint8_t ack);

// 发送一个起始信号
void soft_i2c_start(soft_i2c_t* soft_i2c);

// 发送一个停止信号
void soft_i2c_stop(soft_i2c_t* soft_i2c);

// 等待ACK
uint8_t soft_i2c_wait_ack(soft_i2c_t* soft_i2c);

// 发送ACK
void soft_i2c_ack(soft_i2c_t* soft_i2c);

// 发送NACK
void soft_i2c_nack(soft_i2c_t* soft_i2c);

#endif   // !MTLIB_DRIVER_SOFT_I2C_H
